package com.msaon.imageUtils;

import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.imageio.ImageIO;

public class ImageUtils {
	
	/** 
    * 采用指定宽度、高度或压缩比例 的方式对图片进行压缩 
    * @param imgsrc 源图片地址 
    * @param imgdist 目标图片地址 
    * @param widthdist 压缩后图片宽度（当rate==null时，必传） 
    * @param heightdist 压缩后图片高度（当rate==null时，必传） 
    * @param rate 压缩比例  
    */  
	public static void reduceImg(String imgsrc, String imgdist, int widthdist,  
	        int heightdist, Float rate) {  
	    try {  
	        File srcfile = new File(imgsrc);  
	        // 检查文件是否存在  
	        if (!srcfile.exists()) {  
	            return;  
	        }  
	        // 如果rate不为空说明是按比例压缩  
	        if (rate != null && rate > 0) {  
	            // 获取文件高度和宽度  
	            int[] results = getImgWidth(srcfile);  
	            if (results == null || results[0] == 0 || results[1] == 0) {  
	                return;  
	            } else {  
	                widthdist = (int) (results[0] * rate);  
	                heightdist = (int) (results[1] * rate);  
	            }  
	        }  
	        // 开始读取文件并进行压缩  
	        Image src = javax.imageio.ImageIO.read(srcfile);  
	        BufferedImage tag = new BufferedImage((int) widthdist,  
	                (int) heightdist, BufferedImage.TYPE_INT_RGB);  
	
	        tag.getGraphics().drawImage(  
	                src.getScaledInstance(widthdist, heightdist,  
	                        Image.SCALE_SMOOTH), 0, 0, null);  
	
	        FileOutputStream out = new FileOutputStream(imgdist);  
	        String formatName = imgdist.substring(imgdist.lastIndexOf(".") + 1);  
	        //FileOutputStream out = new FileOutputStream(dstName);  
	        //JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);  
	        //encoder.encode(dstImage);  
	        ImageIO.write(tag, /*"GIF"*/ formatName /* format desired */ , new File(imgdist) /* target */ );  
	        out.close();  
	
	    } catch (Exception ex) {  
	        ex.printStackTrace();  
	        System.out.println("==生成失败："+imgsrc);
	    }  
	}
	
	/** 
	    * 获取图片宽度 
	    *  
	    * @param file 
	    *            图片文件 
	    * @return 宽度 
	    */  
	   public static int[] getImgWidth(File file) {  
	       InputStream is = null;  
	       BufferedImage src = null;  
	       int result[] = { 0, 0 };  
	       try {  
	           is = new FileInputStream(file);  
	           src = javax.imageio.ImageIO.read(is);  
	           result[0] = src.getWidth(null); // 得到源图宽  
	           result[1] = src.getHeight(null); // 得到源图高  
	           is.close();  
	       } catch (Exception e) {  
	           e.printStackTrace();  
	       }  
	       return result;  
	   } 
	   
	   /**
		 * 遍历指定文件夹及子文件夹下的文件
		 * 
		 * @author testcs_dn
		 * @date	2014年12月12日下午2:33:49
		 * @param file 要遍历的指定文件夹
		 * @param collector 符合条件的结果加入到此List<File>中
		 * @param includes 已生成缩略图的图片名加入到此List<String>中
		 * @param fileNameInclude 缩略图规则名，用以排除以生成过的图片
		 * @param fileNameContain 查找包含特定文件名的文件
		 * @param suffixLi 文件扩展名为指定类型集合
		 * @throws IOException
		 */
		public static void listFiles(File file,List<File> collector,List<String> includes,
				String fileNameInclude,String fileNameContain, List<String> suffixLi) throws IOException {
			if (file.isFile() 
					&& (isBlank(fileNameContain) || file.getName().indexOf(fileNameContain)!=-1)
					&& (suffixLi==null || suffixLi.size()<=0 || suffixLi.contains(file.getName().split("\\.")[1].toLowerCase()))
					){
				if(!isBlank(fileNameInclude) && file.getName().indexOf(fileNameInclude) != -1){
					includes.add(file.getName().replace(fileNameInclude, ""));
				}else{
					collector.add(file);
				}
			}
			if((!file.isHidden() && file.isDirectory()) && !isIgnoreFile(file)) {
				File[] subFiles = file.listFiles();
				for(int i = 0; i < subFiles.length; i++) {
					listFiles(subFiles[i],collector,includes, fileNameInclude,fileNameContain, suffixLi);
				}
				if(includes!=null && includes.size()>0&& collector!=null && collector.size()>0){
					Iterator<File> it = collector.iterator();
					while(it.hasNext()){
						File x = it.next();
						if(includes.contains(x.getName())){
							it.remove();
						}
					}
				}
			}
		}
	//推断文件夹是否须要忽略

	private static boolean isIgnoreFile(File file) {
		List<String> ignoreList = new ArrayList<String>();
		ignoreList.add(".svn");
		ignoreList.add("CVS");
		ignoreList.add(".cvsignore");
		ignoreList.add("SCCS");
		ignoreList.add("vssver.scc");
		ignoreList.add(".DS_Store");
		for(int i = 0; i < ignoreList.size(); i++) {
			if(file.getName().equals(ignoreList.get(i))) {
				return true;
			}
		}
		return false;
	}
	
	public static boolean isBlank(final CharSequence cs) {
        int strLen;
        if (cs == null || (strLen = cs.length()) == 0) {
            return true;
        }
        for (int i = 0; i < strLen; i++) {
            if (Character.isWhitespace(cs.charAt(i)) == false) {
                return false;
            }
        }
        return true;
    }
	}
